#ifndef FINDWORDS_H
#define FINDWORDS_H

#include <QObject>

class QAbstractItemModel;
class QSortFilterProxyModel;
class QProgressBar;
class QModelIndex;
class Finder;


/** Рашифровка с помощью поиска по словарю.
 *
 * @author Василий Почкаенко
 */
class FindWords : public QObject{
Q_OBJECT
private:
	/** Текст для дешифровки.*/
	QString text;

	/** Модель для замены символов.*/
	QAbstractItemModel * KeyMdl;

	/** Модель для подходящих слов.*/
	QAbstractItemModel * WordsMdl;

	/** Ищет подходящие слова в словаре.*/
	Finder * finder;

	/** Фильтр модели слов.*/
	QSortFilterProxyModel *FilterWordsMdl;

	/** Модель для слов для возможности отмены.*/
	QAbstractItemModel * CancelMdl;

	/** Индикатор прогресса.*/
	QProgressBar * progress;

	/** Установить символ в ключ.*/
	inline void setChar(const QChar & s, const QChar & t);
public:
	explicit FindWords(QProgressBar * progressBar, QObject *parent = 0);

	/** Модель для замены символов.*/
	QAbstractItemModel * keyMdl() const;

	/** Модель для подходящих слов.*/
	QAbstractItemModel * wordsMdl() const;

	/** Модель для слов для возможности отмены.*/
	QAbstractItemModel * cancelMdl() const;

signals:
	/** Выслать расшифрованный текст.*/
	void reText(const QString & reText);
public slots:
	/** Отменить вариант расшифровки согласно cancelMdl*/
	void cancelSetWord(const QModelIndex & index);

	/** Перенести найденное слово в ключ.*/
	void setWord(const QModelIndex & index);

	/** Сформировать модель ключа.*/
	void createKeyModel(const QString & text);

	/** Расшифровать текст
	*
	* Высылает reText().
	*/
	void reScr();

	/** Найти слова.*/
	void findWords();

	/** Установить фильтр модели слов.*/
	void setFilterWords();

	/** Сохранить.*/
	void save(const QString & fileName);

	/** Загрузить.*/
	void open(const QString & fileName);
};

#endif // FINDWORDS_H
